package com.yungu.swift.order.service;

import com.yungu.swift.assets.driver.model.dto.CarModelValuationDto;
import com.yungu.swift.assets.driver.model.vo.DriverSignLogVo;
import com.yungu.swift.base.ResponseData;
import com.yungu.swift.base.service.BaseService;
import com.yungu.swift.order.model.dto.OrderDetailDto;
import com.yungu.swift.order.model.dto.OrderFareDto;
import com.yungu.swift.order.model.param.*;
import com.yungu.swift.order.model.vo.ApiJoinValuationVo;
import com.yungu.swift.order.model.vo.CrosstownFareInfoVo;
import com.yungu.swift.order.model.vo.DriverExamineInfoVo;
import com.yungu.swift.order.model.vo.OrderEstimateVo;

import java.util.List;
import java.util.Map;


/**
 * Copyright © 厦门云谷互联信息有限公司 2018-2020 All Right Reserved
 * <p>
 * 订单费用业务逻辑处理接口
 * 重写 add
 *
 * @author Zerrion
 * @version 1.0.0-RELEASE
 * @since 2018-07-03 15:24
 */
public interface OrderFareService extends BaseService<OrderFareDto> {

    /**
     * 估价
     *
     * @param valuationParam 参数
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> commonValuation(ApiValuationParam valuationParam);

    /**
     * 日租半日租估价
     */
    ResponseData<Map<String, Object>> rentValuate(String passengerUuid, String appid, String priceRuleUuid);

    /**
     * 跨城拼车估价
     */
    ResponseData<ApiJoinValuationVo> joinValuation(OrderEvaluateParam orderEvaluateParam);

    /**
     * 跨城小件估价
     */
    ResponseData<Map<String, Object>> parcelValuation(JoinOrderParam joinOrderParam);

    /**
     * 实时获取订单价格
     *
     * @param orderUuidParam 参数
     * @return ResponseData
     */
    ResponseData<OrderEstimateVo> getRealtimeFare(ApiOrderUuidParam orderUuidParam);

    /**
     * 保存订单价格
     *
     * @param carValuationDto 参数
     * @param orderFareDto    参数
     * @param planTrip        参数
     * @param uploadText      参数
     * @param orderDetailDto  参数
     * @return AjaxList
     */
    ResponseData<Boolean> saveTotalFare(CarModelValuationDto carValuationDto, OrderFareDto orderFareDto, Double planTrip, String uploadText, OrderDetailDto orderDetailDto);


    /**
     * 根据订单uuid 获取计价规则
     *
     * @param orderUuid 参数
     * @return CarModelValuationDto
     */
    ResponseData<CarModelValuationDto> getCarModelValuationDto(String orderUuid);

    /**
     * 保存空驶费
     *
     * @param orderUuid   参数
     * @param serviceFare 参数
     * @return AjaxList
     */
    ResponseData<Boolean> surcharge(String orderUuid, Double serviceFare);

    /**
     * 司机保存金额（保存实际金额）
     *
     * @param orderUuid  参数
     * @param actualFare 参数
     * @param otherFare  参数
     * @return AjaxList
     */
    ResponseData<Boolean> updFare(String orderUuid, Double actualFare, Double otherFare);

    /**
     * 获取司机考核统计订单相关数据
     *
     * @param uuid      参数
     * @param startTime 参数
     * @param endTime   参数
     * @return DriverSignLogVo
     */
    ResponseData<DriverSignLogVo> findExaminationList(String uuid, String startTime, String endTime);


    /**
     * 根据订单uuid查询
     *
     * @param orderUuid 参数
     * @return OrderFareDto
     */
    ResponseData<OrderFareDto> findByOrderUuid(String orderUuid);

    /**
     * 出租车获取取消订单产生的费用说明
     *
     * @param orderUuid 参数
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getPasCancelFare(String orderUuid);

    /**
     * 出租车司机取消订单  取消说明
     *
     * @param orderUuid 参数
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getWaitFare(String orderUuid);

    /**
     * 获取订单费用详情
     *
     * @param orderUuid  订单 uuid
     * @param couponUuid 优惠券 uuid
     * @param type 司乘两端调用判断1乘客端，2司机端
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getFareItems(String orderUuid, String couponUuid, int type);

    /**
     * 跨城费用项
     *
     * @return
     */
    ResponseData<CrosstownFareInfoVo> crosstownFareItems(String orderUuid, Integer identity);

    /**
     * 【专车、出租车】获取超时等待费用
     *
     * @param orderUuid 参数
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getBeyondWaitFare(String orderUuid);

    /**
     * 根据查询对象（司机，公司，代理商，运营商）获取司机的流水
     *
     * @param map 参数
     * @return Double
     */
    ResponseData<Double> getIncome(Map<String, Object> map);

    /**
     * 后台调整金额
     *
     * @param orderAdjustFareParam 参数
     * @return AjaxList
     */
    ResponseData<Boolean> adjustFare(AdminOrderAdjustFareParam orderAdjustFareParam);

    /**
     * 获取订单费用信息，包括预估里程，预估价格
     *
     * @param orderUuid 参数
     * @return OrderFareDto
     */
    ResponseData<OrderFareDto> getOrderFareDetail(String orderUuid);

    /**
     * 增加额外费用
     *
     * @param orderFareDto 参数
     * @return AjaxList
     */
    ResponseData<Boolean> saveAdditionalFare(OrderFareDto orderFareDto);

    /**
     * 保存或更新（根据 uuid 或者 orderUuid 判断新增或更新）
     *
     * @param orderFareDto 参数
     * @return OrderFareDto
     */
    ResponseData<Boolean> saveOrUpdate(OrderFareDto orderFareDto);

    /**
     * 司机催款
     *
     * @param orderUuid  参数
     * @param driverUuid 参数
     * @return AjaxList
     */
    ResponseData<Boolean> rushFare(String orderUuid, String driverUuid);

    /**
     * 跨城车型费用信息
     */
    ResponseData<List<Map<String, Object>>> crosstownCarLevelFareList(ApiJoinCarModelParam joinCarModelParam);

}
